/**
 * 日期时间工具类
 * 统一管理项目中所有的日期时间格式化函数
 */

/**
 * 格式化相对时间（如：刚刚、5分钟前、2小时前等）
 * @param {string|Date|number} dateInput - 日期字符串、Date对象或时间戳
 * @returns {string} 格式化后的相对时间字符串
 */
export const formatTime = (dateInput) => {
  if (!dateInput) return ''

  const date = new Date(dateInput)
  const now = Date.now()
  const diff = now - date.getTime()
  
  // 时间单位常量
  const minute = 60 * 1000
  const hour = 60 * minute
  const day = 24 * hour
  const week = 7 * day

  // 小于1分钟
  if (diff < minute) {
    return '刚刚'
  }
  
  // 小于1小时
  if (diff < hour) {
    const minutes = Math.floor(diff / minute)
    return `${minutes}分钟前`
  }
  
  // 小于24小时
  if (diff < day) {
    const hours = Math.floor(diff / hour)
    return `${hours}小时前`
  }
  
  // 小于7天
  if (diff < week) {
    const days = Math.floor(diff / day)
    return `${days}天前`
  }
  
  // 超过7天，显示具体日期
  return date.toLocaleDateString('zh-CN', {
    year: 'numeric',
    month: 'long',
    day: 'numeric'
  })
}

/**
 * 格式化时间为简短格式（用于详情页等场景）
 * @param {string|Date|number} dateInput - 日期字符串、Date对象或时间戳
 * @returns {string} 格式化后的时间字符串（如：14:30）
 */
export const formatTimeShort = (dateInput) => {
  if (!dateInput) return ''

  const date = new Date(dateInput)
  const now = new Date()
  const diff = now.getTime() - date.getTime()
  
  // 小于1小时显示分钟
  if (diff < 60 * 60 * 1000) {
    const minutes = Math.floor(diff / (60 * 1000))
    return minutes <= 0 ? '刚刚' : `${minutes}分钟前`
  }
  
  // 小于24小时显示小时
  if (diff < 24 * 60 * 60 * 1000) {
    const hours = Math.floor(diff / (60 * 60 * 1000))
    return `${hours}小时前`
  }
  
  // 其他情况显示具体时间
  return date.toLocaleTimeString('zh-CN', {
    hour: '2-digit',
    minute: '2-digit'
  })
}

/**
 * 格式化日期为中文格式
 * @param {string|Date|number} dateInput - 日期字符串、Date对象或时间戳
 * @param {boolean} includeYear - 是否包含年份，默认为智能判断（当年不显示年份）
 * @returns {string} 格式化后的日期字符串（如：12月25日 或 2023年12月25日）
 */
export const formatDate = (dateInput, includeYear = null) => {
  if (!dateInput) return ''

  const date = new Date(dateInput)
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  
  const currentYear = new Date().getFullYear()
  
  // 如果没有明确指定是否包含年份，则智能判断
  if (includeYear === null) {
    includeYear = year !== currentYear
  }
  
  if (includeYear) {
    return `${year}年${month}月${day}日`
  } else {
    return `${month}月${day}日`
  }
}

/**
 * 格式化完整的日期时间（用于详细显示）
 * @param {string|Date|number} dateInput - 日期字符串、Date对象或时间戳
 * @param {boolean} includSeconds - 是否包含秒数，默认为false
 * @returns {string} 格式化后的完整日期时间字符串
 */
export const formatDateTime = (dateInput, includeSeconds = false) => {
  if (!dateInput) return ''

  try {
    const date = new Date(dateInput)
    
    if (includeSeconds) {
      return date.toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      })
    } else {
      return date.toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit'
      })
    }
  } catch (err) {
    console.error('日期格式化错误:', err)
    return String(dateInput)
  }
}

/**
 * 格式化北京时间（特殊格式：XXXX年X月X日 XX时XX分XX秒）
 * @param {string|Date|number} dateInput - 日期字符串、Date对象或时间戳
 * @returns {string} 格式化后的北京时间字符串
 */
export const formatBeijingTime = (dateInput) => {
  if (!dateInput) return ''

  try {
    const date = new Date(dateInput)
    
    // 转换为北京时间（UTC+8）
    const beijingDate = new Date(date.getTime() + 8 * 60 * 60 * 1000)
    
    const year = beijingDate.getUTCFullYear()
    const month = beijingDate.getUTCMonth() + 1
    const day = beijingDate.getUTCDate()
    const hours = beijingDate.getUTCHours().toString().padStart(2, '0')
    const minutes = beijingDate.getUTCMinutes().toString().padStart(2, '0')
    const seconds = beijingDate.getUTCSeconds().toString().padStart(2, '0')

    return `${year}年${month}月${day}日 ${hours}时${minutes}分${seconds}秒`
  } catch (err) {
    console.error('北京时间格式化错误:', err)
    return String(dateInput)
  }
}

/**
 * 格式化侧边栏日期（简单的年-月-日格式）
 * @param {string|Date|number} dateInput - 日期字符串、Date对象或时间戳
 * @returns {string} 格式化后的日期字符串（如：2024-01-15）
 */
export const formatSidebarDate = (dateInput) => {
  if (!dateInput) return '无日期'

  try {
    const date = new Date(dateInput)
    
    if (isNaN(date.getTime())) {
      return '日期错误'
    }

    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')

    return `${year}-${month}-${day}`
  } catch (err) {
    console.error('侧边栏日期格式化错误:', err)
    return '日期错误'
  }
}

/**
 * 判断两个日期是否为同一天
 * @param {string|Date|number} date1 - 第一个日期
 * @param {string|Date|number} date2 - 第二个日期
 * @returns {boolean} 是否为同一天
 */
export const isSameDay = (date1, date2) => {
  if (!date1 || !date2) return false
  
  const d1 = new Date(date1)
  const d2 = new Date(date2)
  
  return d1.getFullYear() === d2.getFullYear() &&
         d1.getMonth() === d2.getMonth() &&
         d1.getDate() === d2.getDate()
}

/**
 * 判断日期是否为今天
 * @param {string|Date|number} dateInput - 日期
 * @returns {boolean} 是否为今天
 */
export const isToday = (dateInput) => {
  return isSameDay(dateInput, new Date())
}

/**
 * 判断日期是否为昨天
 * @param {string|Date|number} dateInput - 日期
 * @returns {boolean} 是否为昨天
 */
export const isYesterday = (dateInput) => {
  const yesterday = new Date()
  yesterday.setDate(yesterday.getDate() - 1)
  return isSameDay(dateInput, yesterday)
}

/**
 * 获取日期的开始时间（00:00:00）
 * @param {string|Date|number} dateInput - 日期
 * @returns {Date} 该日期的开始时间
 */
export const getStartOfDay = (dateInput) => {
  const date = new Date(dateInput)
  date.setHours(0, 0, 0, 0)
  return date
}

/**
 * 获取日期的结束时间（23:59:59.999）
 * @param {string|Date|number} dateInput - 日期
 * @returns {Date} 该日期的结束时间
 */
export const getEndOfDay = (dateInput) => {
  const date = new Date(dateInput)
  date.setHours(23, 59, 59, 999)
  return date
}
